package storage

import (
	"encoding/json"
	"errors"
	"os"
	"path/filepath"
	"sync"
)

const (
	configFile = "totp_secrets.json"
)

var (
	secrets map[string]string
	mutex   sync.RWMutex
	loaded  bool
)

// 初始化存储
func init() {
	secrets = make(map[string]string)
	loadSecrets()
}

// loadSecrets 从配置文件加载密钥
func loadSecrets() error {
	mutex.Lock()
	defer mutex.Unlock()

	if loaded {
		return nil
	}

	// 获取当前执行目录
	dir, err := os.Getwd()
	if err != nil {
		return err
	}

	configPath := filepath.Join(dir, configFile)

	// 检查配置文件是否存在
	if _, err := os.Stat(configPath); os.IsNotExist(err) {
		// 文件不存在，创建空的配置
		secrets = make(map[string]string)
		loaded = true
		return nil
	}

	// 读取配置文件
	data, err := os.ReadFile(configPath)
	if err != nil {
		return err
	}

	// 解析 JSON
	if len(data) > 0 {
		err = json.Unmarshal(data, &secrets)
		if err != nil {
			return err
		}
	}

	loaded = true
	return nil
}

// saveSecrets 保存密钥到配置文件
func saveSecrets() error {
	mutex.RLock()
	defer mutex.RUnlock()

	// 获取当前执行目录
	dir, err := os.Getwd()
	if err != nil {
		return err
	}

	configPath := filepath.Join(dir, configFile)

	// 将密钥转换为 JSON
	data, err := json.MarshalIndent(secrets, "", "  ")
	if err != nil {
		return err
	}

	// 写入配置文件
	return os.WriteFile(configPath, data, 0600)
}

// SaveSecret 保存账号对应的密钥
func SaveSecret(account, secret string) error {
	if err := loadSecrets(); err != nil {
		return err
	}

	mutex.Lock()
	secrets[account] = secret
	mutex.Unlock()

	return saveSecrets()
}

// GetSecret 获取账号对应的密钥
func GetSecret(account string) (string, error) {
	if err := loadSecrets(); err != nil {
		return "", err
	}

	mutex.RLock()
	secret, exists := secrets[account]
	mutex.RUnlock()

	if !exists {
		return "", errors.New("账号不存在")
	}

	return secret, nil
}

// DeleteSecret 删除账号对应的密钥
func DeleteSecret(account string) error {
	if err := loadSecrets(); err != nil {
		return err
	}

	mutex.Lock()
	_, exists := secrets[account]
	if !exists {
		mutex.Unlock()
		return errors.New("账号不存在")
	}

	delete(secrets, account)
	mutex.Unlock()

	return saveSecrets()
}
